package com.asia5b.a5mall.middleware.api

import com.asia5b.a5mall.middleware.model.base.ResultModel
import com.asia5b.a5mall.middleware.model.bean.PostCommentAgainBean
import com.asia5b.a5mall.middleware.model.bean.PostCommentBean
import com.asia5b.a5mall.middleware.model.bean.PostGoodsBean
import com.asia5b.a5mall.middleware.model.goods.Goods2CommenModel
import com.asia5b.a5mall.middleware.model.member.*
import com.asia5b.a5mall.middleware.model.shop.AbsGoodsModel
import com.asia5b.a5mall.middleware.model.shop.AbsShopModel
import com.asia5b.a5mall.middleware.utils.UUID
import io.reactivex.Observable
import okhttp3.ResponseBody
import retrofit2.http.*

/**
 * Created by zhangyuncai on 2019/12/21.
 * @Note   会员Api
 */
interface MemberApi {

    /**
     * @Note   获取会员信息
     * @param  会员信息
     * todo 获取个人信息
     */
    @GET("members")
    fun memberInfo(): Observable<MemberModel>

    /**
     * @Note   退出登录
     * @param  uid  用户表示ID
     */
    @POST("members/logout")
    fun logout(@Query("uid") uid: String): Observable<ResponseBody>

    /**
     * @Note   更改会员Info
     * @param  nickname 会员信息
     * @param  region   地区
     * @param  sex      性别
     * @param  birthday 生日
     * @param  address  详细地址
     * @param  email    电子邮件
     * @param  tel      电话
     * @param  face     头像
     */
    @PUT("members")
    fun editMemberInfo(@Query("nickname") nickname: String,
                       @Query("region") region: Int?,
                       @Query("sex") sex: Int,
                       @Query("birthday") birthday: Long,
                       @Query("address") address: String,
                       @Query("email") email: String,
                       @Query("tel") tel: String,
                       @Query("face") face: String): Observable<MemberModel>

    /**
     * @Note   获取会员 计数信息 订单数 等等
     */
    @GET("members/statistics")
    fun getMemberOther(): Observable<MemberCountModel>

    /** ==============================地址=============================== */

    /**
     * @Note   查询当前会员的某个地址
     * @param   id    要查询的地址id
     */
    @GET("members/address/{id}")
    fun getAddressDetail(@Path("id") id: Int): Observable<AddressModel>


    /**
     * @Note   删除会员地址
     * @param   id    要删除的会员地址id
     */
    @DELETE("members/address/{id}")
    fun deleteAddress(@Path("id") id: Int): Observable<ResponseBody>


    /**
     * @Note   修改会员地址
     * @param   name    收货人姓名
     * @param   addr    详细地址
     * @param   tel    联系电话(一般指座机)
     * @param   mobile    手机号码
     * @param   defAddr    是否为默认收货地址,1为默认
     * @param   shipAddressName    地址别名
     * @param   region    地区
     * @param   id    主键
     */
    @PUT("members/address/{id}")
    fun editAddress(
            @Path("id") id: Int,
            @QueryMap map: HashMap<String, Any>
    ): Observable<ResponseBody>


    /**
     * @Note   添加会员地址
     * @param   name    收货人姓名
     * @param   addr    详细地址
     * @param   tel    联系电话(一般指座机)
     * @param   mobile    手机号码
     * @param   defAddr    是否为默认收货地址,1为默认
     * @param   shipAddressName    地址别名
     * @param   region    地区
     */
    @POST("members/address")
    fun addAddress(@QueryMap map: HashMap<String, Any>): Observable<ResponseBody>


    /**
     * @Note   设置地址为默认
     * @param   id    主键
     */
    @PUT("members/address/{id}/default")
    fun setAddressDefault(@Path("id") id: Int): Observable<ResponseBody>


    /**
     * @Note   查询当前会员地址列表
     */
    @GET("members/addresses")
    fun getAddressList(): Observable<ArrayList<AddressModel>>


    /** ============================== 会员商品收藏表相关API =============================== */


    /**
     * @Note   删除会员商品收藏
     * @param   goodsId    商品id
     */
    @DELETE("members/collection/goods/{goods_id}")
    fun deleteCollection(@Path("goods_id") goodsId: Int): Observable<ResponseBody>

    /**
     * @Note   删除会员多个商品收藏
     * @param   goodsIds    商品id
     */
    @DELETE("members/collection/goodsmore/{goods_ids}")
    fun deleteCollectionList(@Path("goods_ids") goodsIds: String): Observable<ResponseBody>

    /**
     * @Note   删除会员足迹收藏
     * @param   id    足迹商品id
     */
    @DELETE("members/history/{id}")
    fun deleteFoot(@Path("id") id: Int): Observable<ResponseBody>

    /**
     * @Note   删除会员多个商品足迹
     * @param   goodsIds    商品id
     */
    @DELETE("members/history/more/{ids}")
    fun deleteFootList(@Path("ids") ids: String): Observable<ResponseBody>


    /**
     * @Note   我的咨询列表 http://47.88.223.5:4001/members/asks?page_no=1&page_size=10
     */
    @GET("members/asks")
    fun getAskDatas(@Query("page_no") pageNo: Int,
                    @Query("page_size") pageSize: Int = ApiManager.PAGE_SIZE): Observable<ResultModel<ArrayList<AskModel>>>


    /**
     * @Note   添加会员商品收藏
     * @param   goodsId    商品id
     */
    @POST("members/collection/goods")
    fun addCollection(@Query("goods_id") goodsId: Int): Observable<ResponseBody>


    /**
     * @Note   查询会员商品收藏列表
     * @param   pageNo    页码
     * @param   pageSize    每页显示数量
     */
    @GET("members/collection/goods")
    fun getCollectionList(
            @Query("page_no") pageNo: Int,
            @Query("page_size") pageSize: Int = ApiManager.PAGE_SIZE): Observable<ResultModel<ArrayList<AbsGoodsModel>>>


    /**
     * @Note   查询会员足迹
     * @param   pageNo    页码
     * @param   pageSize    每页显示数量
     */
    @GET("members/history/list")
    fun getFootList(
            @Query("page_no") pageNo: Int,
            @Query("page_size") pageSize: Int = ApiManager.PAGE_SIZE): Observable<ResultModel<ArrayList<FootModel>>>

    /**
     * @Note   查询会员足迹
     * @param   pageNo    页码
     * @param   pageSize    每页显示数量
     *  未读
     * http://47.88.223.5:4001/members/member-nocice-logs?page_no=1&page_size=5&read=0
     * 所有
     * http://47.88.223.5:4001/members/member-nocice-logs?page_no=1&page_size=5&type=all
     */
    @GET("members/member-nocice-logs")
    fun getMessageList(
            @Query("type") type: String = "all",
            @Query("page_no") pageNo: Int,
            @Query("page_size") pageSize: Int = ApiManager.PAGE_SIZE): Observable<ResultModel<ArrayList<MessageModel>>>

    /** ============================== 会员收藏店铺表相关API  =============================== */

    /**
     * @Note   删除会员收藏店铺
     * @param   shopId    要删除的店铺id
     */
    @DELETE("members/collection/shop/{shop_id}")
    fun deleteCollectionShop(@Path("shop_id") shopId: Int): Observable<ResponseBody>

    /**
     * @Note   删除会员收藏店铺
     * @param   shopIds    要删除的店铺id
     */
    @DELETE("members/collection/shopmore/{shop_ids}")
    fun deleteCollectionShopList(@Path("shop_ids") shopIds: String): Observable<ResponseBody>


    /**
     * @Note   添加会员收藏店铺
     * @param   shopId    店铺id
     */
    @POST("members/collection/shop")
    fun addCollectionShop(@Query("shop_id") shopId: Int): Observable<ResponseBody>


    /**
     * @Note   查询会员收藏店铺列表
     * @param   pageNo    页码
     * @param   pageSize    每页显示数量
     */
    @GET("members/collection/shops")
    fun getCollectionShopList(@Query("page_no") pageNo: Int,
                              @Query("page_size") pageSize: Int = ApiManager.PAGE_SIZE): Observable<ResultModel<ArrayList<AbsShopModel>>>


    /** ============================== 评论相关API =============================== */

    /**
     * @author Snow
     * @From   MemberApi
     * @Date   2018-08-14 15:14:05
     * @Note   提交评论
     * @param   comment    comment
     */
    @POST("members/comments")
    fun addComment(@Body comment: PostCommentBean): Observable<ResponseBody>

    /**
     * @author Snow
     * @From   MemberApi
     * @Date   2018-08-14 15:14:05
     * @Note   提交追加评论
     * @param   comment    comment
     * /members/comments/additional
     */
    @POST("members/comments/additional")
    fun addCommentAgain(@Body comment: ArrayList<PostGoodsBean>): Observable<ResponseBody>

    @POST("members/comments/additional")
    fun addCommentAgain2(@Body comment: ArrayList<PostCommentAgainBean>): Observable<ResponseBody>

    @GET("members/comments/{comment_id}")
    fun getCommentDetail(@Path("comment_id") comment_id: String): Observable<CommentsModel>

    /**
     * 获取初次评论详细
     */
    @GET("members/comments/detail")
    fun getFirstCommentDetail(@Query("order_sn") order_sn: String): Observable<ArrayList<CommentsModel>>

    /**
     * @Note 获取评论列表
     */
    @GET("members/comments/list")
    fun getCommentsList(@Query("page_no") pageNo: Int,
                        @Query("page_size") pageSize: Int = ApiManager.PAGE_SIZE,
                        @Query("comment_status") comment_status: String = "FINISHED"): Observable<ResultModel<ArrayList<CommentsModel>>>

    /**
     * @Note   查询某商品的评论
     * @param   content    评论内容
     * @param   goodsName    商品名称
     * @param   grade    好中差评
     * @param   haveImage    是否有图
     * @param   keyword    模糊查询的关键字
     * @param   memberId    会员id
     * @param   memberName    会员名称
     * @param   replyStatus    回复状态
     * @param   pageNo    页码
     * @param   pageSize    每页显示数量
     * @param   goodsId    商品ID
     */
    @GET("members/comments/goods/{goods_id}")
    fun getComments(@Path("goods_id") goodsId: Int, @Query("grade") grade: String?,
                    @Query("have_image") haveImage: Int?, @Query("page_no") pageNo: Int,
                    @Query("page_size") pageSize: Int = ApiManager.PAGE_SIZE): Observable<ResultModel<ArrayList<Goods2CommenModel>>>


    /** ============================== 会员信任登录API  =============================== */

    /**
     * @Note   获取绑定列表API
     */
    @GET("account-binder/list")
    fun getBinderList(): Observable<ArrayList<BindThirdModel>>


    /**
     * @Note   登录绑定openid
     * @param   uuid    客户端唯一标识
     */
    @POST("account-binder/login/{uuid}")
    fun openidBind(@Path("uuid") uuid: String = UUID.uuid): Observable<ResponseBody>

    /**
     * @Note   登录绑定openid
     * @param   uuid    客户端唯一标识
     */
    @POST("passport/account-binder/app")
    fun openidBind2(@Query("openid") openid: String,
                    @Query("type") type: String,
                    @Query("uuid") uuid: String = UUID.uuid): Observable<ResponseBody>


    /**
     * @Note   注册绑定openid
     * @param   uuid    客户端唯一标识
     */
    @POST("account-binder/register/{uuid}")
    fun registerBind(@Path("uuid") uuid: String): Observable<ResponseBody>


    /**
     * @Note   会员解绑操作
     * @param   type    登录方式:QQ,微博,微信,支付宝
     */
    @POST("account-binder/pc/{type}")
    fun unbind(@Path("type") type: String): Observable<ResponseBody>

    /**
     * @Note   会员解绑操作
     * @param   type    登录方式:QQ,微博,微信,支付宝
     */
    @POST("account-binder/unbind/{type}")
    fun unbind2(@Path("type") type: String): Observable<ResponseBody>

    /**
     * @Note   发起账号绑定
     * @param   type    登录方式:QQ,微博,微信,支付宝
     */
    @GET("account-binder/pc/{type}")
    fun initiate(@Path("type") type: String): Observable<ResponseBody>

    /**
     * @Note   发起账号绑定
     * @param   type    登录方式:QQ,微博,微信,支付宝
     */
    @GET("passport/connect/wechat/auth")
    fun connectWechat(@Header("user-agent") user_agent: String = "micromessenger"): Observable<ResponseBody>


    /** ============================== 会员优惠券相关API =============================== */

    /**
     * @Note   用户领取优惠卷
     * @param   couponId    优惠券id
     */
    @POST("members/coupon/{coupon_id}/receive")
    fun receiveCoupon(@Path("coupon_id") couponId: String): Observable<ResponseBody>


    /**
     * @Note   查询我的优惠券列表
     * @param   status    优惠券状态 0为全部，1为未使用，2为已使用，3为已过期user-agent
     * @param   pageNo    页数
     * @param   pageSize    条数
     */
    @GET("members/coupon")
    fun getCouponListByAll(@Query("status") status: Int, @Query("page_no") pageNo: Int,
                           @Query("page_size") pageSize: Int = ApiManager.PAGE_SIZE): Observable<ResultModel<ArrayList<CouponModel>>>


    /** ============================== 会员积分相关API =============================== */

    /**
     * @Note   查询会员积分列表
     * @param   pageNo    页码
     * @param   pageSize    每页显示数量
     */
    @GET("members/points")
    fun getPointList(@Query("page_no") pageNo: Int, @Query("page_size") pageSize: Int = ApiManager.PAGE_SIZE): Observable<ResultModel<ArrayList<PointModel>>>


    /**
     * @Note   查询当前会员的积分
     */
    @GET("members/points/current")
    fun getPoint(): Observable<ResponseBody>


    /**
     * @Note   手机号码绑定API
     * @param   smsCode    手机验证码
     * @param   mobile    手机号
     */
    @PUT("members/security/bind/{mobile}")
    fun bindMobile(@Path("mobile") mobile: String, @Query("sms_code") smsCode: String): Observable<ResponseBody>


    /**
     * @Note   验证换绑验证验证码
     * @param   smsCode    验证码
     */
    @GET("members/security/exchange-bind")
    fun checkExchangeBindCode(@Query("sms_code") smsCode: String): Observable<ResponseBody>


    /**
     * @Note   发送绑定手机验证码
     * @param   uuid    uuid客户端的唯一标识
     * @param   captcha    图片验证码
     * @param   mobile    手机号码
     */
    @POST("members/security/bind/send/{mobile}")
    fun sendBindSmsCode(@Path("mobile") mobile: String, @Query("uuid") uuid: String,
                        @Query("captcha") captcha: String): Observable<ResponseBody>


    /**
     * @Note   验证修改密码验证码
     * @param   smsCode    验证码
     */
    @GET("members/security/password")
    fun checkUpdatePwdCode(@Query("sms_code") smsCode: String): Observable<ResponseBody>


    /**
     * @Note   修改密码 之后的设置新密码
     * @param   uuid    uuid客户端的唯一标识
     * @param   captcha    图片验证码
     * @param   password    密码
     */
    @PUT("members/security/password")
    fun updatePassword(@Query("uuid") uuid: String, @Query("captcha") captcha: String,
                       @Query("password") password: String): Observable<ResponseBody>


    /**
     * @Note   手机号码换绑API
     * @param   smsCode    手机验证码
     * @param   mobile    手机号
     */
    @PUT("members/security/exchange-bind/{mobile}")
    fun exchangeBindMobile(@Path("mobile") mobile: String, @Query("sms_code") smsCode: String, @Query("gr") gr: String): Observable<ResponseBody>


    /**
     * @Note   发送手机验证验证码
     * @param   uuid    uuid客户端的唯一标识
     * @param   captcha    图片验证码
     */
    @POST("members/security/send")
    fun sendValSmsCode(@Query("uuid") uuid: String, @Query("captcha") captcha: String): Observable<ResponseBody>


}